OpenGL - Chargeur BMP

Définition

Un chargeur d'image permet de lire une image sur disque et de monter en mémoire les informations utiles pour pouvoir transformer cette image en texture.

Ce chapitre va vous expliquer les détails du format bmp. Un exemple de chargeur est disponible dans les sources corresponadantes à ce chapitre (image.h et image.cpp)

 

Nous avons vu rapidement dans un chapitre précédent comment appliquer une texture en utilisant une librairie d'image. Si vous ne voulez juste qu'utiliser des images sans aller plus loin et que leur formats ne vous intéresse pas je vous conseil de vous arrêter ici dans la lecture de ce chapitre, et d'utiliser Devil ou OpenIL (c'est la même librairie mais vous pouvez la trouvez sous ces deux noms) qui gère tous les formats d'image dont vous avez besoin.

Par contre si vous êtes un peu plus curieux et que vous avez envie de travailler directement sur vos images il est relativement facile de le faire avec du BMP car ce format n'est pas compressé, ce qui rend la lecture des données images assez simple.

Le format BMP

Afin d'illustrer nos specifications je vous conseils de lire les lignes qui suivent avec la fonction ChargerBMP() de la source image.cpp sous vos yeux.

La lecture d'un fichier bmp doit commencer par son entête. La taille de cette en tete est de 54 octets.

La premiere information utile que nous allons trouver est la largeur de l'image qui est un entier (4 octets) se trouvant au 18eme octet du fichier.

La seconde information est la hauteur de l'image (entier: 4 octets) qui se trouve à la suite. Je rappel que lors d'une lecture de fichier le curseur progresse d'autant d'octets lus.

La troisième valeur est codé sur un short (2 octets) donc il faut avancer le curseur de deux octets, qui ne nous servent pas, et lire les deux octets suivants. Cette valeur nous donne le nombre de bits. C'est ce qui détermine si l'image est en 24 bits ou en 32 bits. Dans le premier cas l'image est de forme RGB (red,green,blue) et dans le second cas elle est de forme RGBA (red,green,blue,alpha) alpha étant une composante définissant la transparence d'un pixel. Le bmp peut être aussi en 8 bits mais ce format ne nous intéressant pas, nous n'allons pas le gérer dans notre source exemple.

Maintenant nous pouvons calculer la taille de l'image: largeur*hauteur*nbCouleur.
Le nbCouleur étant 3 en RGB et 4 en RGBA. Donc il faut allouer en mémoire autant d'octets qu'il faut pour pouvoir stocker notre image.

Maintenant nous avons fini de lire l'entête du fichier nous pouvons nous placer sur les données de l'image, c'est à dire au 54eme octets, ou 24 octets plus loin que la fin de la lecture du nombre de bits. Et nous pouvons lire d'un trait toutes les données de l'image en les stockants dans notre éspace mémoire. Nous pouvons fermer le fichier et passer à la suite.

Les couleurs des données que nous avons en mémoire sont inversées, donc ils faut prévoir une petite routine qui puisse les inverser afin d'obtenir les couleurs correctes.

Transformation d'une image en texture

Donc maintenant que nous avons notre image en mémoire, nous pouvons la transformer en texture OpenGL.

Il faut génerer 1 texture glGenTexture(); à l'adresse de la variable qui nous servira d'espace de stockage pour la texture.

Ensuite nous pouvons construire un 'mipmap' sur notre image, pour cela on bind ce que l'on a gener&eavcute; et on appel gluBuild2DMipmaps(GL_TEXTURE_2D,3,largeur,hauteur,bits,GL_UNSIGNED_BYTE,donneesimages); où 3 représente le niveau de mipmap.

On peut appliquer des filtres pour améliorer la qualitée de la texture, avec glTexParameteri().

Et enfin on peut donner les données de l'image à opengl pour qu'il construise la texture glTexImage2D(), et c'est fini.

Attention: lorsqu'on crée une texture avec glGenTexture() il ne faut pas oublier de la détruire à la fin du programme avec glDeleteTexture();

 
Retour
contact: ultrafil [AT] fr.st